/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Persistence;
import javax.persistence.Query;

/**
 *
 * @author Ing Arturo
 */
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pregunta implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String pregunta;
    private boolean condicionada;
    private String tipo2;
    @OneToMany(cascade = {CascadeType.REMOVE, CascadeType.PERSIST})
    private List<Condicion> cond;
    @ManyToOne
    private Indicador indicador;

    public Pregunta() {
        cond = new ArrayList<Condicion>();
        condicionada = false;
    }

    public Pregunta(String pregunta, String tipo) {
        this.pregunta = pregunta;
        this.condicionada = false;
        this.cond = new ArrayList<Condicion>();
        this.tipo2 = tipo;
    }

    public List<Condicion> getCond() {
        return cond;
    }

    public void setCond(List<Condicion> cond) {
        this.cond = cond;
    }

    public Pregunta(Long id, String pregunta, boolean condicion) {
        this.id = id;
        this.pregunta = pregunta;
        this.condicionada = condicion;
    }

    public Pregunta(String pregunta, boolean condicion) {
        this.pregunta = pregunta;
        this.condicionada = condicion;
    }

    //usado
    public Pregunta(String pregunta) {
        this.pregunta = pregunta;
        this.condicionada = false;
        this.cond = new ArrayList<Condicion>();
    }

    public void agregarCon(Condicion c) {
        this.cond.add(c);
    }

    public void agregarC(String condicionadora, String condicionada, String metodo, String valor) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("APU");
        EntityManager em = emf.createEntityManager();
        Pregunta pcdora = em.find(Pregunta.class, Long.parseLong(condicionadora));
        Pregunta pcnada = em.find(Pregunta.class, Long.parseLong(condicionada));
        Condicion co = new Condicion(condicionadora, condicionada, metodo, valor);
        pcdora.agregarCon(co);
        pcnada.setCondicionada(true);
        em.getTransaction().begin();
        em.persist(pcdora);
        em.persist(pcnada);
        em.getTransaction().commit();
        em.close();
        emf.close();

    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPregunta() {
        return pregunta;
    }

    public String getPreguntaCorta() {
        if (this.pregunta.length() > 40) {
            String pc = this.pregunta.substring(1, 40);
            pc += "..";
            return pc;
        }
        return pregunta;
    }

    public void setPregunta(String pregunta) {
        this.pregunta = pregunta;
    }

    public boolean isCondicionada() {
        return condicionada;
    }

    public void setCondicionada(boolean condicionada) {
        this.condicionada = condicionada;
    }

    public String getTipo2() {
        return tipo2;
    }

    public void setTipo2(String tipo) {
        this.tipo2 = tipo;
    }

    public List getLista(Long id) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("APU");
        EntityManager em = emf.createEntityManager();
        Query q = em.createQuery("SELECT p FROM Pregunta p WHERE p.id <" + id);
        return q.getResultList();
    }
     public Long getCantidad() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("APU");
        EntityManager em = emf.createEntityManager();
        Query q = em.createQuery("SELECT Count(p) FROM Pregunta p");
        return (Long)q.getSingleResult();
    }



    public List getLista() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("APU");
        EntityManager em = emf.createEntityManager();
        Query q = em.createQuery("SELECT p FROM Pregunta p");
        return q.getResultList();
    }

    public List getLista(int start, int limite) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("APU");
        EntityManager em = emf.createEntityManager();
        Query q = em.createQuery("SELECT p FROM Pregunta p Limit "+start+" , "+limite);
        return q.getResultList();
    }

    public Pregunta buscar(Long id) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("APU");
        EntityManager em = emf.createEntityManager();
        Pregunta p = em.find(Pregunta.class, id);
        em.close();
        emf.close();
        return p;
    }

    public Indicador getIndicador() {
        return indicador;
    }

    public void setIndicador(Indicador indicador) {
        this.indicador = indicador;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Pregunta)) {
            return false;
        }
        Pregunta other = (Pregunta) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Modelo.Pregunta[id=" + id + "]";
    }

    public void agregarPregunta(Pregunta pregunta) {



        EntityManagerFactory emf = Persistence.createEntityManagerFactory(
                "APU");

        // Crear el EntityManager para accesso a la capa de persistencia
        EntityManager em = emf.createEntityManager();
        // Se es transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n de escritura, obtener la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        // del EntityManager e iniciarla
        em.getTransaction().begin();

        // Marcar el registro en la base de datos
        em.persist(pregunta);

        // Ejecutar la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        em.getTransaction().commit();

    }

    public Pregunta findPregunta(Long id) {


        Pregunta pre = new Pregunta();

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(
                "APU");

        // Crear el EntityManager para accesso a la capa de persistencia
        EntityManager em = emf.createEntityManager();
        // Se es transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n de escritura, obtener la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        // del EntityManager e iniciarla
        em.getTransaction().begin();

        // Marcar el registro en la base de datos
        pre = em.find(Pregunta.class, id);

        // Ejecutar la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        em.getTransaction().commit();

        return pre;

    }

    public void actualizarPregunta(Pregunta pre) {



        EntityManagerFactory emf = Persistence.createEntityManagerFactory(
                "APU");

        // Crear el EntityManager para accesso a la capa de persistencia
        EntityManager em = emf.createEntityManager();
        // Se es transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n de escritura, obtener la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        // del EntityManager e iniciarla
        em.getTransaction().begin();

        // Marcar el registro en la base de datos
        em.merge(pre);

        // Ejecutar la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        em.getTransaction().commit();

    }

    public void asociarIndicador(Long idp,Long idin){

        EntityManagerFactory emf = Persistence.createEntityManagerFactory(
                "APU");

        // Crear el EntityManager para accesso a la capa de persistencia
        EntityManager em = emf.createEntityManager();
        // Se es transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n de escritura, obtener la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        // del EntityManager e iniciarla
        em.getTransaction().begin();
        Pregunta p = em.find(Pregunta.class, idp);
        if(idin==-1){
        p.setIndicador(null);
        }else{
        Indicador i = em.find(Indicador.class, idin);
        p.setIndicador(i);
        }
        
        em.persist(p);

        // Ejecutar la transacciÃƒÆ’Ã†â€™Ãƒâ€ Ã¢â‚¬â„¢ÃƒÆ’Ã¢â‚¬Â ÃƒÂ¢Ã¢â€šÂ¬Ã¢â€žÂ¢ÃƒÆ’Ã†â€™ÃƒÂ¢Ã¢â€šÂ¬Ã…Â¡ÃƒÆ’Ã¢â‚¬Å¡Ãƒâ€šÃ‚Â³n
        em.getTransaction().commit();
    }




}
